package modelo;

import modelo.BtnCasilla;
import modelo.Tiempo;
import javax.swing.Timer;


import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
import java.io.Serializable;

public class Buscaminas extends javax.swing.JPanel  {
	
	private Timer timer;
    private int tiempo;
	int nroMinas=0;
	int nroMinasAlto = 0;
	int nroMinasAncho = 0;
	private int casillas;
	int x=0;
	private String nombre;
	BtnCasilla[][] tablero = null;
	int tamanoCuadro = 50;//px
	boolean inicio = true;
	
	
	public Buscaminas(int nroMinasAlto , int nroMinasAncho, int nroMinas) {
		super();
		this.nroMinas = nroMinas;
		this.nroMinasAlto = nroMinasAlto;
		this.nroMinasAncho = nroMinasAncho;
	//	this.casillas = casillas;
		//this.tamañoCuadro = tamañoCuadro;
		//this.inicio = inicio;
	}
	public Buscaminas() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Buscaminas(boolean arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}
	public Buscaminas(LayoutManager arg0, boolean arg1) {
		super(arg0, arg1);
		// TODO Auto-generated constructor stub
	}
	public Buscaminas(LayoutManager arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}
	public Buscaminas(int nroMinas, int nroMinasAlto, int nroMinasAncho,
			int casillas, BtnCasilla[][] tablero, int tamanoCuadro,
			boolean inicio) {
		super();
		this.nroMinas = nroMinas;
		this.nroMinasAlto = nroMinasAlto;
		this.nroMinasAncho = nroMinasAncho;
		this.casillas = casillas;
		this.tablero = tablero;
		this.tamanoCuadro = tamanoCuadro;
		this.inicio = inicio;
		x=0;
	}
	
	public int getNroMinas() {
		return nroMinas;
	}
	public void setNroMinas(int nroMinas) {
		this.nroMinas = nroMinas;
	}
	public int getNroMinasAlto() {
		return nroMinasAlto;
	}
	public void setNroMinasAlto(int nroMinasAlto) {
		this.nroMinasAlto = nroMinasAlto;
	}
	public int getNroMinasAncho() {
		return nroMinasAncho;
	}
	public void setNroMinasAncho(int nroMinasAncho) {
		this.nroMinasAncho = nroMinasAncho;
	}
	public int getCasillas() {
		return casillas;
	}
	public void setCasillas(int casillas) {
		this.casillas = casillas;
	}
	public int getTamanoCuadro() {
		return tamanoCuadro;
	}
	public void setTamanoCuadro(int tamanoCuadro) {
		this.tamanoCuadro = tamanoCuadro;
	}
	public boolean isInicio() {
		return inicio;
	}
	public void setInicio(boolean inicio) {
		this.inicio = inicio;
	}
	
	final public void cargarTablero() {
        inicio = true;
        this.tablero = generarTablero(nroMinasAlto, nroMinasAncho, nroMinas);
        this.removeAll();
        this.setLayout(new GridLayout(nroMinasAlto, nroMinasAncho));
        // Agrego los botones generados al panel
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[i].length; j++) {
                this.add(tablero[i][j]);
                tablero[i][j].addMouseListener(btnMouseLister); //Le asigno el listener
            }
        }
        this.setSize(tamanoCuadro * nroMinasAncho, tamanoCuadro * nroMinasAlto);
        updateUI();
    }
        
    private final MouseListener btnMouseLister = new MouseAdapter() {

        @Override
        public void mouseReleased(MouseEvent e) {
            abrir((BtnCasilla) e.getSource(), e.getButton());
        }
         
    };

    private static BtnCasilla[][] generarTablero(int nroCasillasAlto, int nroCasillasAncho, int nroMinas)
    {
        BtnCasilla[][] tablero = new BtnCasilla[nroCasillasAlto][nroCasillasAncho];
        for (int i = 0; i < nroMinas; i++) {//Pongo Minas De forma random
            int alto = (int) Math.round(Math.random() * (nroCasillasAlto - 1)), ancho = (int) Math.round(Math.random() * (nroCasillasAncho - 1));
            if (tablero[alto][ancho] == null) {
                //Si la casilla ya tiene mina
                tablero[alto][ancho] = new BtnCasilla(-1);
            } else {
                //Si no retrocedo en 1
                i--;
            }
        }
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[i].length; j++) {//Recorro todo el tablero buscando no minas, para darle valores
                if (tablero[i][j] == null) {//Si no es mina.
                    int c = 0;
                    //Cuento cuantas minas hay alrededor
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            try {
                                if (tablero[i - k][j - l].getValue() == -1) {//-1 es mina.
                                    c++;
                                }
                            } catch (Exception e) {//TryCatch Por que si no tiene valor dara null exception
                            }
                        }
                    }
                    tablero[i][j] = new BtnCasilla(c);//Le creo casilla, con el valor calculado de minas
                }
            }
        }
        return tablero;
    }
    private void abrir(BtnCasilla b, int button) {
        
    	if (!b.isEnabled()) {
            return;
        }
    	x++;
        if (button == MouseEvent.BUTTON3) {
            b.bandera();
            return;
        }
        if (b.mostrar() == -1) {
            if (inicio) {//Toda esta vaina, es para que no me de mina, a mi primer clic.. es algo molestoso. xD.
                for (int i = 0; i < 10; i++) {
                    for (int j = 0; j < tablero.length; j++) {
                        if (tablero[i][j].equals(b)) {
                            cargarTablero();
                            abrir(tablero[i][j], button);
                            return;
                        }
                    }
                }
            }
            mostrarValores();
            JOptionPane.showMessageDialog(null, "Perdiste");
            //timer.stop();
        } else {
            if (b.getValue() == 0) {
                mostrarAlrededor(b);
            }
            if (cuantosQuedan()==this.nroMinas)
            {
            	JOptionPane.showMessageDialog(this, "ganaste");
            	//timer.stop();
            	int niv=4;
            	if (nroMinas==10) niv=1;
            	if (nroMinas==40) niv=2;
            	if (nroMinas==100) niv=3;
            	Jugador jug = new Jugador(JOptionPane.showInputDialog(nombre), x,niv);
            	new JugadorDAO().registrarJugador(jug);
            }
        }
        inicio = false;
    }
    private int cuantosQuedan()
    {
    	int c=0;
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[i].length; j++) {//Recorro todo el tablero buscando no minas, para darle valores
                if (tablero[i][j] != null) 
                	if(tablero[i][j].isEnabled())
                		c++;
                		
                }
                }
        return c;
 
    }

    private void mostrarAlrededor(BtnCasilla b) {
        Toolkit.getDefaultToolkit().beep(); 
        b.mostrar();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < tablero.length; j++) {
                if (tablero[i][j].equals(b)) {
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            try {
                                BtnCasilla t=tablero[i - k][j - l];
                                if (t.getValue() == 0) {//-1 es mina.
                                    if (t.isEnabled()) {
                                        mostrarAlrededor(t);
                                    }
                                }else{
                                    t.mostrar();
                                }
                            } catch (Exception e) {
                            }
                        }
                    }
                }
            }
        }

    }

    private void mostrarValores() {
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[i].length; j++) {
                tablero[i][j].mostrar();
            }
        }
    }

   
}
